home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / util / arg2str.c next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  3.2 KB  |  173 lines

  1. /* arg2str: list of arguments to string */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/util/RCS/arg2str.c,v 6.0 1991/12/18 20:25:18 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/util/RCS/arg2str.c,v 6.0 1991/12/18 20:25:18 jpo Rel $
  9.  *
  10.  * $Log: arg2str.c,v $
  11.  * Revision 6.0  1991/12/18  20:25:18  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "util.h"
  19. #include "retcode.h"
  20.  
  21. extern void err_abrt ();
  22.  
  23. /* convert an array of strings to one or more lines of 'arguments'.
  24.  *
  25.  * this is intended to be used along with the str2arg() routine.
  26.  */
  27.  
  28. int arg2vstr (linelen, maxlen, buf, argv) /* convert the list to a string */
  29.     int linelen;
  30.     int maxlen;                         /* length of string */
  31.     char *buf;                          /* where to put the output string */
  32.     char **argv;                        /* the argument vector */
  33. {
  34.     unsigned totlen,    /* total length of current line */
  35.         len;        /* length of current argument */
  36.     unsigned gotdelim;    /* a delimiter char is in arg */
  37.     unsigned gotpair;    /* key/value pair */
  38.     char tmpstr[8*BUFSIZ];    /* string under construction  */
  39.     register char *src,
  40.         *bp,
  41.         *dest = NULLCP;
  42.  
  43.     bp = buf;
  44.     for (totlen = gotpair = 0, *bp = '\0';
  45.          *argv != (char *) 0; argv++)
  46.     {
  47.         if (gotpair  == 0 && strcmp ("=", *argv) == 0)
  48.         {
  49.             dest = tmpstr;
  50.             gotpair = 2; /* take the next two arguments  */
  51.             continue;
  52.         }
  53.  
  54.  
  55.         if(**argv == '\0'){
  56.             gotdelim = TRUE;
  57.             goto nextone;
  58.         }
  59.         for (src = *argv, gotdelim = FALSE; *src != '\0'; src++)
  60.             switch (*src)
  61.             {
  62.                 case ' ':
  63.                 case '\t':
  64.                 case '=':
  65.                 case ',':
  66.                 case ';':
  67.                 case ':':
  68.                 case '/':
  69.                 case '|':
  70.                 case '.':
  71.                 case '#':
  72.                 gotdelim = TRUE;
  73.                 goto nextone;
  74.             }
  75.  
  76.         nextone:
  77.         if (gotpair == 0)
  78.             dest = tmpstr;
  79.         if (gotdelim)
  80.             *dest++ = '"';
  81.         for (src = *argv; *src != '\0'; src++)
  82.         {
  83.             switch (*src)
  84.             {
  85.                 case '\b':
  86.                 *dest++ = '\\';
  87.                 *dest++ = 'b';
  88.                 break;
  89.  
  90.                 case '\t':
  91.                 *dest++ = '\\';
  92.                 *dest++ = 't';
  93.                 break;
  94.  
  95.                 case '\f':
  96.                 *dest++ = '\\';
  97.                 *dest++ = 'f';
  98.                 break;
  99.  
  100.                 case '\r':
  101.                 *dest++ = '\\';
  102.                 *dest++ = 'r';
  103.                 break;
  104.  
  105.                 case '\n':
  106.                 *dest++ = '\\';
  107.                 *dest++ = 'n';
  108.                 break;
  109.  
  110.                 case '\\': /*  Added by Doug Kingston  */
  111.                 case '\"':
  112.                 *dest++ = '\\';
  113.                 *dest++ = *src;
  114.                 break;
  115.  
  116.                 default:
  117.                 if (iscntrl (*src))
  118.                 {
  119.                     *dest++ = '\\';
  120.                     *dest++ = ((*src >> 6) & 07) + '0';
  121.                     *dest++ = ((*src >> 3) & 07) + '0';
  122.                     *dest++ =  (*src & 07) + '0';
  123.                 }
  124.                 else
  125.                     *dest++ = *src;
  126.             }
  127.         }
  128.  
  129.         if (gotdelim)
  130.             *dest++ = '"';
  131.  
  132.         switch (gotpair) /* handle key/value differently         */
  133.         {
  134.             case 2:
  135.             *dest++ = '=';
  136.             gotpair--;
  137.             continue;
  138.  
  139.             case 1:
  140.             gotpair = 0;
  141.         }
  142.  
  143.         *dest = '\0';
  144.         len = dest - tmpstr;
  145.  
  146.         if (totlen != 0)
  147.         {
  148.             if ((linelen > 0) && ((totlen + len) > linelen))
  149.             {
  150.                 *bp ++ = '\n';
  151.                 *bp ++ = '\t';
  152.                 maxlen -= 2;
  153.                 totlen = 8;
  154.             }
  155.             else
  156.             {
  157.                 *bp ++ = ' ';
  158.                 maxlen --;
  159.                 totlen += 1;
  160.             }
  161.             *bp = '\0';
  162.         }
  163.         if (maxlen < len)
  164.             return NOTOK;
  165.         maxlen -= len;
  166.         for (dest = tmpstr; *dest;)
  167.             *bp ++ = *dest++;
  168.         *bp = '\0';
  169.         totlen += len;
  170.     }
  171.     return OK;
  172. }
  173.